package com.securinets.BD;

import java.util.ArrayList;
import java.util.Iterator;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.securinets.news.Article;

public class ArticlesDBAdapter {
	
	   private static final int BASE_VERSION = 1;
	   private static final String BASE_NOM = "articles.db";
	   private static final String TABLE_ARTICLES = "table_articles";
	   private static final String COLONNE_ID = "id";
	   private static final int COLONNE_ID_ID = 0;
	   private static final String COLONNE_TITRE = "titre";
	   private static final int COLONNE_TITRE_ID = 1;
	   private static final String COLONNE_IMAGE = "image";
	   private static final int COLONNE_IMAGE_ID = 2;
	   private static final String COLONNE_DESC = "description";
	   private static final int COLONNE_DESC_ID = 3;
	   
	  
	  

	   // L’instance de la base qui sera manipulée au travers de cette classe.
	   private SQLiteDatabase maBaseDonnees;
	   private MaBaseOpenHelper baseHelper;
	   public ArticlesDBAdapter(Context ctx ) {
	      baseHelper = new MaBaseOpenHelper(ctx, BASE_NOM, null, BASE_VERSION);
	   }
	   /**
	    * Ouvre la base de données en écriture.
	    */
	   public SQLiteDatabase open() {
	      maBaseDonnees = baseHelper.getWritableDatabase();
	      return maBaseDonnees;
	   }
	   /**
	    * Ferme la base de données.
	    */
	  public void close() {
	      maBaseDonnees.close();
	   }
	   public SQLiteDatabase getBaseDonnees() {
	      return maBaseDonnees;
	   }
	   
	   /**
	    * Récupère un article en fonction de son nom.
	    */
	   public Article getArticle(String nom) {
		   Cursor c = maBaseDonnees.query(TABLE_ARTICLES, new String[] {
				      COLONNE_ID, COLONNE_TITRE, COLONNE_IMAGE, COLONNE_DESC }, COLONNE_TITRE + " LIKE ?" , new String[] {nom}, null,
				      null, null);
				return cursorToArticle(c);
	   }
	   /**
	    * Récupère un article en fonction de son id.
	    */
	  public Article getArticle(int id) {
		  Cursor c = maBaseDonnees.query(TABLE_ARTICLES, new String[] {
				  COLONNE_ID, COLONNE_TITRE, COLONNE_IMAGE, COLONNE_DESC}, COLONNE_ID + " = ?" ,new String[] {""+id+""}, null,
			         null, null);
			   return cursorToArticle(c);
			   
	   }
	   /**
	    * Retourne toutes les articles de la base de données.
	    */
	  public ArrayList<Article> getAllArticles() {
		  Cursor c = maBaseDonnees.query(TABLE_ARTICLES, new String[] {
				  COLONNE_ID, COLONNE_TITRE, COLONNE_IMAGE, COLONNE_DESC }, null, null, null,
			         null, null);
			   return cursorToArticles(c);
	   }
	   /**
	    * Insère un article dans la table des planètes.
	    */
	  public long insertArticle(Article article) {
		  ContentValues valeurs = new ContentValues();
		   valeurs.put(COLONNE_TITRE, article.getTitre());
		   valeurs.put(COLONNE_IMAGE, article.getImage());
		   valeurs.put(COLONNE_DESC, article.getDescription());
		   return maBaseDonnees.insert(TABLE_ARTICLES, null, valeurs);
	   }
	  /**
	    * Insère liste d'articles dans la table des articles.
	    */
	  public long insertArticles(ArrayList<Article> articles) {
		  long a = -1;
		  NetoyerBase();
		  
		  for (Iterator<Article> iterator = articles.iterator(); iterator.hasNext();) {
			Article article = (Article) iterator.next();
			ContentValues valeurs = new ContentValues();
			   valeurs.put(COLONNE_TITRE, article.getTitre());
			   valeurs.put(COLONNE_IMAGE, article.getImage());
			   valeurs.put(COLONNE_DESC,  article.getDescription());
			  a = maBaseDonnees.insert(TABLE_ARTICLES, null, valeurs);
			
		}
		  
		   return a; 
	   }
	   /**
	    * Met à jour un article dans la table des articles.
	    */
	   public int updateArticle(int id, Article article) {
		   ContentValues valeurs = new ContentValues();
		   valeurs.put(COLONNE_TITRE, article.getTitre());
		   valeurs.put(COLONNE_IMAGE, article.getImage());
		   valeurs.put(COLONNE_DESC, article.getDescription());
		   return maBaseDonnees.update(TABLE_ARTICLES, valeurs, COLONNE_ID + " = "
		         + id, null);
	   }
	   /**
	    * Supprime un article à partir de son nom.
	    */
	   public int removeArticle(String nom) {
		   return maBaseDonnees.delete(TABLE_ARTICLES, COLONNE_TITRE + " LIKE "
			         + nom, null);
	   }
	   /**
	    * Supprime un article à partir de son id.
	    */
	   public int removeArticle(int id) {
		   return maBaseDonnees.delete(TABLE_ARTICLES, COLONNE_ID + " = " + id,
			         null);
	   }
	   
	   private Article cursorToArticle(Cursor c) {
		   // Si la requête ne renvoie pas de résultat.
		   if (c.getCount() == 0)
		      return null;
		   c.moveToFirst();
		   Article retArticle = new Article();
		   // Extraction des valeurs depuis le curseur.
		   retArticle.setId(String.valueOf(c.getInt(COLONNE_ID_ID)));
		   retArticle.setTitre(c.getString(COLONNE_TITRE_ID));
		   retArticle.setImage(c.getString(COLONNE_IMAGE_ID));
		   retArticle.setDescription(c.getString(COLONNE_DESC_ID));
		   // Ferme le curseur pour libérer les ressources.
		   c.close();
		   return retArticle;
		}
	   
		private ArrayList<Article> cursorToArticles(Cursor c) {
		   // Si la requête ne renvoie pas de résultat.
		   if (c.getCount() == 0)
		      return new ArrayList<Article>(0);
		   ArrayList<Article> retArticles = new ArrayList<Article>(c.getCount());
		   c.moveToFirst();
		   do {
			   Article article = new Article();
			   article.setId(String.valueOf(c.getInt(COLONNE_ID_ID)));
			   article.setTitre(c.getString(COLONNE_TITRE_ID));
			   article.setImage(c.getString(COLONNE_IMAGE_ID));
			   article.setDescription(c.getString(COLONNE_DESC_ID));
			   retArticles.add(article);
		   } while (c.moveToNext());
		   // Ferme le curseur pour libérer les ressources.
		   c.close();
		   return retArticles;
		}
		
		private void NetoyerBase(){
			ArrayList<Article> Base = getAllArticles(); 
			if (Base.size()> 30){
				for (int i = 30; i < Base.size(); i++) {
					removeArticle(Base.get(i).getId());
				}
				
			}
		}
	   
	  

}
